/*
 * testechoserv.c
 *
 *  Created on: Apr 7, 2012
 *      Author: root
 */

// include fig01
/*

#include	"unp.h"

#define FD_SETSIZE2	5

int k = 0;

int main(int argc, char **argv) {
	int i, j, maxi, maxfd, listenfd, connfd, sockfd;
	int nready, client[FD_SETSIZE2];
	ssize_t n;
	fd_set rset, allset;
	char buf[MAXLINE];
	socklen_t clilen;
	struct sockaddr_in cliaddr, servaddr;

	listenfd = Socket(AF_INET, SOCK_STREAM, 0);

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(SERV_PORT);

	Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

	Listen(listenfd, LISTENQ);

	maxfd = listenfd; // initialize
	maxi = -1; // index into client[] array
	for (i = 0; i < FD_SETSIZE2; i++) // FD_SETSIZE = 5
		client[i] = -1; // -1 indicates available entry
	FD_ZERO(&allset);
	FD_SET(listenfd, &allset);
	// end fig01

	// include fig02
	for (;;) {
		memset(buf, NULL, MAXLINE);
		rset = allset; // structure assignment
		printf("waiting\n");
		nready = Select(maxfd + 1, &rset, NULL, NULL, NULL);

		if (FD_ISSET(listenfd, &rset)) { // new client connection
			clilen = sizeof(cliaddr);
			connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
#ifdef	NOTDEF
			printf("new client: %s, port %d\n",
					Inet_ntop(AF_INET, &cliaddr.sin_addr, 4, NULL),
					ntohs(cliaddr.sin_port));
#endif

			for (i = 0; i < FD_SETSIZE; i++)
				if (client[i] < 0) {
					client[i] = connfd; // save descriptor
					break;
				}
			if (i == FD_SETSIZE)
				err_quit("too many clients");

			FD_SET(connfd, &allset);
			//add new descriptor to set
			if (connfd > maxfd)
				maxfd = connfd; // for select
			if (i > maxi)
				maxi = i; // max index in client[] array

			if (--nready <= 0)
				continue; // no more readable descriptors
		}

		for (i = 0; i <= maxi; i++) { // check all clients for data
			if ((sockfd = client[i]) < 0)
				continue;
			if (FD_ISSET(sockfd, &rset)) {
				printf("1111\n");
				if ((n = Read(sockfd, buf, MAXLINE)) == 0) {
					//4connection closed by client
					Close(sockfd);
					FD_CLR(sockfd, &allset);
					client[i] = -1;
				} else {

					printf("%s", buf);
					Writen(sockfd, buf, n);
				}

				printf("3333\n");
				if (--nready <= 0)
					break; // no more readable descriptors
			}
		}
	}
}

*/
